Подклассирование numpy.ndarray является высокопрофессиональным архитектурным решением, используемым для создания специализированных структур данных, которые инкапсулируют метаданные (например, единицы измерения, координаты или частота дискретизации) вместе с исходными числовыми данными. В отличие от стандартных классов Python, объекты NumPy часто создаются без вызова __init__.
Триада инициализации
Архитекторам необходимо учитывать три различных пути инициализации, при которых стандартный конструктор пропускается:
- Явная конструкция: Использование имени класса (обрабатывается методом
__new__). - Приведение к просмотру: Переинтерпретация существующего массива как вашего подкласса.
- Новый из шаблона: Создание среза или копии существующего экземпляра подкласса.
Специализированный __array_finalize__ хук является точкой схождения, где метаданные синхронизируются по всем этим путям.
Поведенческая хрупкость
Подклассирование создает тесную связь с C-API NumPy. Операции, возвращающие скаляры (например, np.mean()) часто "удаляют" идентичность подкласса, возвращаясь к стандартному ndarray. Управление метаданными, таким образом, представляет постоянную угрозу, если не будет тщательно обработано через переходы состояний.
isinstance(obj, np.ndarray). В противном случае, Композиция (обёртывание массива) безопаснее.